package base

import (
	"JVM/Jvmgo/GoToJVM/runtimeData"
)

// 共用代码
/*
	在java虚拟机规范中，存在如下最基本执行模型的伪代码
	do{
		自动计算PC寄存器的值加一
		根据PC寄存器指示的位置，从字节码流中取出操作码
		if (字节码存在操作数) 从字节码流中取出操作数
		执行操作码所定义的操作数
	} while (字节码流长度 > 0)
*/

type Instruction interface {
	FetchOperands(reader *BytecodeReader)
	Execute(frame *runtimeData.Frame)
}

// 空指令
type NoOperandsInstruction struct {
}

func (self *NoOperandsInstruction) FetchOperands(reader *BytecodeReader) {

}

// 跳转指令
type BranchInstruction struct {
	Offset int // 跳转偏移量
}

func (self *BranchInstruction) FetchOperands(reader *BytecodeReader) {
	self.Offset = int(reader.ReadInt16())
}

// 加载和存储指令(索引为单字节)
// index 为局部变量表索引
type Index8Instruction struct {
	Index uint
}

func (self *Index8Instruction) FetchOperands(reader *BytecodeReader) {
	self.Index = uint(reader.ReadUint8())
}

// 访问运行时常量池的指令(索引为2字节)
type Index16Instruction struct {
	Index uint
}

func (self *Index16Instruction) FetchOperands(reader *BytecodeReader) {
	self.Index = uint(reader.ReadUint16())
}
